import os
import pandas as pd

def merge_and_deduplicate_xlsx(directory_path, deduped_filename="企业基本信息更新6.csv", duplicates_filename="duplicates.csv"):
    """
    合并目录下所有xlsx文件，以第一个文件的列名为标准对齐列，
    输出合并去重的文件和重复项文件到当前目录
    
    参数:
    directory_path: 包含xlsx文件的目录路径
    deduped_filename: 去重后数据的输出文件名 (默认: deduped_data.csv)
    duplicates_filename: 重复项数据的输出文件名 (默认: duplicates.csv)
    """
    # 检查目录是否存在
    if not os.path.isdir(directory_path):
        raise ValueError(f"目录不存在: {directory_path}")
    
    # 获取所有xlsx文件
    xlsx_files = [
        os.path.join(directory_path, f) 
        for f in os.listdir(directory_path) 
        if f.endswith('.xlsx') and not f.startswith('~$')  # 忽略临时文件
    ]
    
    if not xlsx_files:
        print("未找到xlsx文件")
        return
    
    print(f"找到 {len(xlsx_files)} 个xlsx文件")
    
    # 读取第一个文件作为标准
    try:
        standard_df = pd.read_excel(xlsx_files[0], engine='openpyxl')
        standard_columns = standard_df.columns.tolist()
        print(f"\n以第一个文件 '{os.path.basename(xlsx_files[0])}' 的列名为标准:")
        print(f"标准列名 ({len(standard_columns)}列): {standard_columns}")
        
        all_data = [standard_df]
    except Exception as e:
        print(f"读取标准文件出错: {str(e)}")
        return
    
    # 处理后续文件
    for file_path in xlsx_files[1:]:
        try:
            df = pd.read_excel(file_path, engine='openpyxl')
            
            # 检查列数是否匹配
            if len(df.columns) != len(standard_columns):
                print(f"  跳过 {os.path.basename(file_path)}: 列数不匹配 ({len(df.columns)}列 vs 标准 {len(standard_columns)}列)")
                continue
            
            # 对齐列名（按位置顺序）
            df.columns = standard_columns
            all_data.append(df)
            print(f"  已对齐: {os.path.basename(file_path)}")
            
        except Exception as e:
            print(f"  处理文件 {os.path.basename(file_path)} 时出错: {str(e)}")
    
    # 合并所有DataFrame
    combined_df = pd.concat(all_data, ignore_index=True)
    print(f"\n合并后总行数: {len(combined_df)}")
    
    # 去重处理
    initial_count = len(combined_df)
    
    # 标记所有重复行
    duplicate_mask = combined_df.duplicated(keep=False)
    
    # 获取去重后的数据
    deduped_df = combined_df.drop_duplicates()
    final_count = len(deduped_df)
    duplicates_count = initial_count - final_count
    
    print(f"去重后行数: {final_count} (发现重复项: {duplicates_count})")
    
    # 获取重复项数据
    duplicates_df = combined_df[duplicate_mask].copy()
    
    # 添加重复标记列
    duplicates_df['重复标记'] = "重复项"
    
    # 保存文件
    deduped_df.to_csv(deduped_filename, index=False, encoding='utf-8-sig')
    # duplicates_df.to_csv(duplicates_filename, index=False, encoding='utf-8-sig')
    
    print(f"\n结果已保存到当前目录:")
    print(f"- 去重数据: {os.path.abspath(deduped_filename)}")
    # print(f"- 重复项数据: {os.path.abspath(duplicates_filename)}")

# 使用示例
if __name__ == "__main__":
    # 设置包含xlsx文件的目录路径
    input_directory = "./企业基本信息更新7_28"  # 替换为你的目录路径
        
    # 执行合并和去重（使用默认文件名）
    merge_and_deduplicate_xlsx(input_directory)
    
    # 或者自定义输出文件名
    # merge_and_deduplicate_xlsx(
    #     input_directory,
    #     deduped_filename="cleaned_data.csv",
    #     duplicates_filename="duplicate_records.csv"
    # )